package com.telrob.bytevm.instruct;

import java.util.List;

import com.telrob.bytevm.compile.Instruct;
import com.telrob.bytevm.compile.ReplaceCode;
import com.telrob.bytevm.utils.Define;
import com.telrob.bytevm.utils.ToolUtils;
import com.telrob.bytevm.vm.Register;
/***
 * 压栈
 * @author zrz
 *
 */
public class PUSH implements Instruct{
	public boolean isPseudo(String opt) {
		return false;
	}
	@Override
	public boolean isComplie(String opt) {
		if("push".equals(opt.toLowerCase())) {
			return true;
		}
		return false;
	}

	@Override
	public byte[] complie(String line,String[] param,int curretIndex,List<ReplaceCode>labelReplace) {
		byte[]data=new byte[2];
		data[0]=Define.PUSH;
		String o2=param[1].toLowerCase();
		if("ax".equals(o2)) {
			data[1]=Define.AX;
		}else if("bx".equals(o2)) {
			data[1]=Define.BX;
		}else if("cx".equals(o2)) {
			data[1]=Define.CX;
		}else if("dx".equals(o2)) {
			data[1]=Define.DX;
		}else if("ex".equals(o2)) {
			data[1]=Define.EX;
		}else if("ss".equals(o2)) {
			data[1]=Define.SS;
		}else if("si".equals(o2)) {
			data[1]=Define.SI;
		}else if("sp".equals(o2)) {
			data[1]=Define.SP;
		}else if("bp".equals(o2)) {
			data[1]=Define.BP;
		}else if("di".equals(o2)) {
			data[1]=Define.DI;
		}
		
		return data;
	}
	public int isRun(byte opt) {
		if(opt==Define.PUSH) {
			return 2;
		}
		return -1;
	}
	public void parseRun(Register R,byte opt,byte[]data) {
		byte rx=data[R.PC+1];
		int dd=0;
		if(rx==Define.AX) {
			dd=R.AX;
		}else if(rx==Define.BX) {
			dd=R.BX;
		}else if(rx==Define.CX) {
			dd=R.CX;
		}else if(rx==Define.DX) {
			dd=R.DX;
		}else if(rx==Define.EX) {
			dd=R.EX;
		}else if(rx==Define.BP) {
			dd=R.BP;
		}else if(rx==Define.SS) {
			dd=R.SS;
		}else if(rx==Define.SP) {
			dd=R.SP;
		}
		//对堆栈指定的位置进行入站操作
		byte[]temp=ToolUtils.int2bytes(dd);
		data[R.SS+R.SP+0]=temp[0];
		data[R.SS+R.SP+1]=temp[1];
		data[R.SS+R.SP+2]=temp[2];
		data[R.SS+R.SP+3]=temp[3];
		//然后栈顶指针加4
		R.SP+=4;
		//程序指针加2
		R.PC+=isRun(opt);
		
		
	}

}
